/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.GrupoProduto;
import br.com.sysdrive.model.MarcaProduto;
import br.com.sysdrive.model.Produto;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Rodrigo
 */
public class ProdutoDAOImpl {

    private Connection conn;
    private ResultSet rs;

    public ProdutoDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
            System.out.println("Conectado com Sucesso!");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }


    public Integer cadastrar(Object object) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Integer idProduto = null;      
        Produto produto = (Produto) object;
        String sql = "insert into produto(nome_produto, modelo_produto, valor_produto, status_produto, saldo_produto,"
                + " id_grupo_produto, id_marca_produto) values (?,?,?,?,?,?,?) returning id_produto;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, produto.getNomeProduto().toUpperCase());
            stmt.setString(2, produto.getModeloProduto().toLowerCase());
            stmt.setDouble(3, produto.getValorProduto());
            stmt.setString(4, produto.getStatusProduto().toUpperCase());
            stmt.setDouble(5, produto.getSaldoProduto());
            stmt.setInt(6, produto.getGrupoProduto().getIdGrupoProduto());
            stmt.setInt(7, produto.getMarcaProduto().getIdMarcaProduto());
            rs = stmt.executeQuery();
            
            while (rs.next()) {
                idProduto = rs.getInt("id_produto");
            }

        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Compra! Erro CompraDAO:" + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro CompraDAO:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return idProduto;
    }



    public List<Object> listar() {
        List<Object> resultado = new ArrayList<Object>();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select p.*, g.nome_grupo_produto, m.nome_marca_produto "
                + "from produto p, grupo_produto g, marca_produto m "
                + "where p.id_grupo_produto = g.id_grupo_produto "
                + "and p.id_marca_produto = m.id_marca_produto;";
        try {
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Produto produto = new Produto();
                produto.setIdProduto(rs.getInt("id_produto"));
                produto.setNomeProduto(rs.getString("nome_produto"));
                produto.setModeloProduto(rs.getString("modelo_produto"));
                produto.setValorProduto(rs.getDouble("valor_produto"));
                produto.setStatusProduto(rs.getString("status_produto"));
                produto.setSaldoProduto(rs.getDouble("saldo_produto"));

                GrupoProduto grupoProduto = new GrupoProduto();
                grupoProduto.setIdGrupoProduto(rs.getInt("id_grupo_produto"));
                grupoProduto.setNomeGrupoProduto(rs.getString("nome_grupo_produto"));

                produto.setGrupoProduto(grupoProduto);

                MarcaProduto marcaProduto = new MarcaProduto();
                marcaProduto.setIdMarcaProduto(rs.getInt("id_marca_produto"));
                marcaProduto.setNomeMarcaProduto(rs.getString("nome_marca_produto"));

                produto.setMarcaProduto(marcaProduto);

                resultado.add(produto);
            }
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao Listar Produto! Erro: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return resultado;
    }


    public Object carregar(int idObject) {
        Produto produto = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select p.* from produto p where id_produto = ?;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();
            while (rs.next()) {
                produto = new Produto();
                produto.setIdProduto(rs.getInt("id_produto"));
                produto.setNomeProduto(rs.getString("nome_produto"));
                produto.setModeloProduto(rs.getString("modelo_produto"));
                produto.setValorProduto(rs.getDouble("valor_produto"));
                produto.setStatusProduto(rs.getString("status_produto"));
                produto.setSaldoProduto(rs.getDouble("saldo_produto"));

                GrupoProduto grupoProduto = new GrupoProduto();
                grupoProduto.setIdGrupoProduto(rs.getInt("id_grupo_produto"));

                produto.setGrupoProduto(grupoProduto);

                MarcaProduto marcaProduto = new MarcaProduto();
                marcaProduto.setIdMarcaProduto(rs.getInt("id_marca_produto"));

                produto.setMarcaProduto(marcaProduto);
            }
            return produto;
        } catch (SQLException ex) {
            System.out.println("Problemas ao Carregar produto! Erro: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
    }


    public Boolean alterar(Object object) {
        Produto produto = (Produto) object;
        PreparedStatement stmt = null;
        String sql = "update produto set"
                + " nome_produto=?, modelo_produto=?, valor_produto=?, status_produto=?, saldo_produto=?, id_grupo_produto=?, id_marca_produto=? "
                + " where id_produto=?;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, produto.getNomeProduto().toUpperCase());
            stmt.setString(2, produto.getModeloProduto().toUpperCase());
            stmt.setDouble(3, produto.getValorProduto());
            stmt.setString(4, produto.getStatusProduto().toUpperCase());
            stmt.setDouble(5, produto.getSaldoProduto());
            stmt.setInt(6, produto.getGrupoProduto().getIdGrupoProduto());
            stmt.setInt(7, produto.getMarcaProduto().getIdMarcaProduto());
            stmt.setInt(8, produto.getIdProduto());
            stmt.execute();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao Alterar Produto! Erro: " + ex.getMessage());
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro: " + ex.getMessage());
            }
        }
    }
}
